﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Acceso_a_Datos.IDAOS;
using Sistema_Totem.Clases;
using System.Data.SqlClient;
using System.Data;
using Sistema_Totem.Clases.Fabricas;
using System.Data.SqlTypes;
using System.Xml;


namespace Sistema_Totem.Acceso_a_Datos.DAOS
{
    public class DAOPlantilla : iDAOPlantilla
    {

    #region Consultar Plantilla segun su Tipo - Grupo 1
        /// <summary>
        /// Método encargado de consultar la plantilla de un tipo de documento 
        /// particular asociada a un proyecto
        /// </summary>
        /// <returns>Estructura de Plantilla</returns>
        public Entidad ConsultarPlantilla(string tipoDocumento, int idProyecto)
        {
            Conexion enlace = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            Entidad formato = null;
            try
            {
                enlace.AbrirConexionBd();
                command.Connection = enlace.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando a ejecutar
                command.CommandText = "[dbo].[ConsultarDetallePlantilla]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                //Variables del Procedimiento Almacenado
                command.Parameters.AddWithValue("@ProyectoActual", idProyecto);
                command.Parameters["@ProyectoActual"].Direction = ParameterDirection.Input;
                command.Parameters.AddWithValue("@TipoPlantilla", tipoDocumento);
                command.Parameters["@TipoPlantilla"].Direction = ParameterDirection.Input;
                reader = command.ExecuteReader();

                //se carga la informacion consultada en una Lista de Elementos

                while (reader.Read())
                {
                        formato = FabricaEntidad.ObtenerPlantilla();
                        (formato as Plantilla).Id = Convert.ToInt16(reader[0]);
                        string xml = reader.GetSqlXml(1).Value;
                        XmlDocument doc = new XmlDocument();
                        doc.LoadXml(xml);
                        (formato as Plantilla).Estructura =doc;
                        (formato as Plantilla).Nombre = reader.GetString(2);
                        (formato as Plantilla).Descripcion = reader.GetString(3);
                        
                }
                return formato;

            }

            catch (SqlException)
            {
                return null;
            }

            catch (Exception)
            {
                return null;
            }
            finally
            {
                if (reader != null)
                    reader.Close();
                enlace.CerrarConexionBd();
            }
        }
    #endregion Consultar Plantilla segun su Tipo - Grupo 1

        /// <summary>
        /// Agrega la plantilla en formato xml a la base de datos
        /// </summary>
        /// <param name="nombre">Nombre personalizado de la plantilla</param>
        /// <param name="descripcion">Descripcion general</param>
        /// <param name="xml">Archivo XML</param>
        /// <param name="tipo">Tipo de plantilla (por ejemplo, Plantilla ERS)</param>
        public void AgregarPlantilla(String nombre, String descripcion, String xml, String tipo)
        {
            SqlCommand sqlcmd = new SqlCommand();
            Conexion conn = new Conexion();

            try
            {
                conn.AbrirConexionBd();
                sqlcmd.Connection = conn.ObjetoConexion();
                sqlcmd.CommandType = CommandType.StoredProcedure;
                sqlcmd.CommandText = "AgregarXml2";
                sqlcmd.CommandTimeout = 2;
                SqlParameter ProyName = new SqlParameter("@nombre", nombre);
                sqlcmd.Parameters.Add(ProyName);
                SqlParameter ProyName2 = new SqlParameter("@descripcion", descripcion);
                sqlcmd.Parameters.Add(ProyName2);
                SqlParameter ProyName3 = new SqlParameter("@xml", xml);
                sqlcmd.Parameters.Add(ProyName3);
                SqlParameter ProyName4 = new SqlParameter("@tipo", tipo);
                sqlcmd.Parameters.Add(ProyName4);
                sqlcmd.ExecuteNonQuery();

            }


            catch (Exception E)
            {
                Console.WriteLine(E.Message);
            }

            finally
            {
                conn.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Devuelve los datos generales de todas las plantillas: el nombre, tipo y id
        /// </summary>
        /// <returns>Retorna una lista de Plantillas</returns>
        public List<Entidad> DatosPlantilla()
        {
            Conexion conn = new Conexion();
            SqlCommand sqlcmd = new SqlCommand();
            List<Entidad> elementos = new List<Entidad>();



            try
            {
                conn.AbrirConexionBd();
                sqlcmd.Connection = conn.ObjetoConexion();
                sqlcmd.CommandType = CommandType.StoredProcedure;
                sqlcmd.CommandText = "DatosPlantilla";
                sqlcmd.CommandTimeout = 2;


                SqlDataReader sqlrd;
                sqlrd = sqlcmd.ExecuteReader();
                while (sqlrd.Read())
                {
                    Entidad resultado = FabricaEntidad.ObtenerPlantilla();
                    (resultado as Plantilla).Nombre = sqlrd["nombre"].ToString();
                    (resultado as Plantilla).Tipo = sqlrd["tipo"].ToString();
                    (resultado as Plantilla).Id = int.Parse(sqlrd["id"].ToString());
                    elementos.Add(resultado);
                }
                return elementos;
            }


            catch (Exception E)
            {
                Console.WriteLine(E.Message);
                return null;
            }

            finally
            {
                conn.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Busca en base de datos el XML de una plantilla en particular
        /// </summary>
        /// <param name="id"></param>
        /// <returns>Retorna el archivo XML</returns>
        public XmlDocument TraerXml(int id)
        {
            Conexion conn = new Conexion();
            SqlCommand sqlcmd = new SqlCommand();
            XmlDocument resultado = new XmlDocument();

            try
            {
                conn.AbrirConexionBd();
                sqlcmd.Connection = conn.ObjetoConexion();
                sqlcmd.CommandType = CommandType.StoredProcedure;
                sqlcmd.CommandText = "xml";
                sqlcmd.CommandTimeout = 2;

                SqlParameter ProyName = new SqlParameter("@id", id);
                sqlcmd.Parameters.Add(ProyName);
                SqlDataReader sqlrd;
                sqlrd = sqlcmd.ExecuteReader();

                while (sqlrd.Read())
                {
                    SqlXml bolas = sqlrd.GetSqlXml(sqlrd.GetOrdinal("plantilla"));
                    resultado.LoadXml(bolas.Value);
                }
                return resultado;
            }
            catch (Exception E)
            {
                Console.WriteLine(E.Message);
                return null;
            }

            finally
            {
                conn.CerrarConexionBd();
            }
        }
    }
}